package edu.client;

import java.util.LinkedList;

import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.LayoutPanel;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.TextBox;

import edu.client.IngenieriaService.IngenieriaService;
import edu.client.IngenieriaService.IngenieriaServiceAsync;
import edu.shared.DTO.ComponentePatronDTO;
import edu.shared.DTO.EquipoPatronDTO;
import edu.shared.DTO.ListaDeMaterialesDTO;
import edu.shared.DTO.ProductoDTO;
import edu.shared.DTO.RenglonListaMaterialesDTO;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;

public class P_DetalleListaMateriales extends PopupPanel {
	
	private static final int CODIGO = 0;
	private static final int NOMBRE = 1;
	private static final int MEDIDA_VARIABLE_1 = 2;
	private static final int MEDIDA_VARIABLE_2 = 3;
	private static final int CANTIDAD = 4;

	private IngenieriaServiceAsync ingenieriaService;
	
	TextBox codigoTB;
	TextBox nombreTB;
	TextBox planoTB;
	TextBox ultimaVersionTB;
	TextArea descripcionTecnicaTA;
	
	FlexTable materialEquiposYComponentesFT;
	
	ListaDeMaterialesDTO listaDeMaterialesDTO;
	
	String usuario;
	LinkedList<RenglonListaMaterialesDTO> renglonesListaMaterialesDTO = new LinkedList<RenglonListaMaterialesDTO>();
	
	public P_DetalleListaMateriales(String codigoEquipoOComponente) {
	
		super(false);
		
		LayoutPanel layoutPanel = new LayoutPanel();
		setWidget(layoutPanel);
		layoutPanel.setSize("850px", "640px");
		setStyleName("fondoPopup");
		
		ingenieriaService = GWT.create(IngenieriaService.class);
		
		int codigoClase = Integer.parseInt(codigoEquipoOComponente.split("-")[0].substring(0, 2));
		int codigoSubclase = Integer.parseInt(codigoEquipoOComponente.split("-")[0].substring(2, 4));
		String version = codigoEquipoOComponente.split("-")[1];
		int codigoComponente = Integer.parseInt(codigoEquipoOComponente.split("-")[2].substring(0, 2));
		int codigoSubcomponente = Integer.parseInt(codigoEquipoOComponente.split("-")[2].substring(2, 4));
		int plano = Integer.parseInt(codigoEquipoOComponente.split("-")[3]);
		
		if (Validaciones.equipoOComponente(codigoEquipoOComponente) == "EQUIPO") {
			
			ingenieriaService.buscarEquipoPatron(codigoClase, codigoSubclase, plano, version, new AsyncCallback<EquipoPatronDTO>(){
	
				@Override
				public void onFailure(Throwable caught) {
					Window.alert("ERROR EN EL SERVICIO.");
				}
	
				@Override
				public void onSuccess(EquipoPatronDTO result) {
					
					codigoTB.setText(Validaciones.rellenarCodigoEquipoPatron(result));
					nombreTB.setText(result.getNombreClase() + " - " + result.getNombreSubclase());
					planoTB.setText(String.valueOf(result.getPlano()));
					ultimaVersionTB.setText(result.getNroVersion());
					descripcionTecnicaTA.setText(result.getDescripcionTecnica());
					
					verListaMateriales(result.getIdListaDeMateriales());
				}
			});
		}
		else {
			
			ingenieriaService.buscarComponentePatron(codigoClase, codigoSubclase, version, codigoComponente, codigoSubcomponente, plano, new AsyncCallback<ComponentePatronDTO>(){
				
				@Override
				public void onFailure(Throwable caught) {
					Window.alert("ERROR EN EL SERVICIO.");
				}
	
				@Override
				public void onSuccess(ComponentePatronDTO result) {
					
					codigoTB.setText(Validaciones.rellenarCodigoComponentePatron(result));
					nombreTB.setText(result.getNombre());
					planoTB.setText(String.valueOf(result.getPlano()));
					ultimaVersionTB.setText(result.getNroVersion());
					descripcionTecnicaTA.setText(result.getDescripcionTecnica());
					
					verListaMateriales(result.getIdListaMateriales());
				}
			});
		}
			
		
		//Sección donde se establece el detalle de la orden de pedido.
		Label detalleEquipoOComponenteLabel = new Label("DETALLE DEL EQUIPO O COMPONENTE PATRÓN");
		detalleEquipoOComponenteLabel.setStyleName("labelTitulo");
		layoutPanel.add(detalleEquipoOComponenteLabel);
		layoutPanel.setWidgetLeftWidth(detalleEquipoOComponenteLabel, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(detalleEquipoOComponenteLabel, 15.0, Unit.PX, 50.0, Unit.PX);
		
		Label codigoLabel = new Label("CÓDIGO:");
		codigoLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		codigoLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(codigoLabel);
		layoutPanel.setWidgetLeftWidth(codigoLabel, 0.0, Unit.PCT, 19.8, Unit.PCT);
		layoutPanel.setWidgetTopHeight(codigoLabel, 70.0, Unit.PX, 19.0, Unit.PX);
		
		codigoTB = new TextBox();
		layoutPanel.add(codigoTB);
		layoutPanel.setWidgetLeftWidth(codigoTB, 20.0, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(codigoTB, 65.0, Unit.PX, 32.0, Unit.PX);
		codigoTB.setEnabled(false);
		
		Label planoLabel = new Label("PLANO:");
		planoLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		planoLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(planoLabel);
		layoutPanel.setWidgetLeftWidth(planoLabel, 0.0, Unit.PCT, 19.8, Unit.PCT);
		layoutPanel.setWidgetTopHeight(planoLabel, 105.0, Unit.PX, 19.0, Unit.PX);
		
		planoTB = new TextBox();
		layoutPanel.add(planoTB);
		layoutPanel.setWidgetLeftWidth(planoTB, 20.0, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(planoTB, 100.0, Unit.PX, 32.0, Unit.PX);
		planoTB.setEnabled(false);
		
		Label descripcionTecnicaLabel = new Label("DESCRIPCIÓN TÉCNICA:");
		descripcionTecnicaLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		descripcionTecnicaLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(descripcionTecnicaLabel);
		layoutPanel.setWidgetLeftWidth(descripcionTecnicaLabel, 0.0, Unit.PCT, 19.8, Unit.PCT);
		layoutPanel.setWidgetTopHeight(descripcionTecnicaLabel, 175.0, Unit.PX, 40.0, Unit.PX);
		
		descripcionTecnicaTA = new TextArea();
		layoutPanel.add(descripcionTecnicaTA);
		layoutPanel.setWidgetLeftWidth(descripcionTecnicaTA, 20.0, Unit.PCT, 75.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(descripcionTecnicaTA, 135.0, Unit.PX, 100.0, Unit.PX);
		descripcionTecnicaTA.setEnabled(false);
		
		Label nombreLabel = new Label("NOMBRE:");
		nombreLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		nombreLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(nombreLabel);
		layoutPanel.setWidgetLeftWidth(nombreLabel, 50.0, Unit.PCT, 19.8, Unit.PCT);
		layoutPanel.setWidgetTopHeight(nombreLabel, 70.0, Unit.PX, 19.0, Unit.PX);
		
		nombreTB = new TextBox();
		layoutPanel.add(nombreTB);
		layoutPanel.setWidgetLeftWidth(nombreTB, 70.0, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(nombreTB, 65.0, Unit.PX, 32.0, Unit.PX);
		nombreTB.setEnabled(false);
		
		Label ultimaVersionLabel = new Label("ULTIMA VERSIÓN:");
		ultimaVersionLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		ultimaVersionLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(ultimaVersionLabel);
		layoutPanel.setWidgetLeftWidth(ultimaVersionLabel, 50.0, Unit.PCT, 19.8, Unit.PCT);
		layoutPanel.setWidgetTopHeight(ultimaVersionLabel, 105.0, Unit.PX, 19.0, Unit.PX);
		
		ultimaVersionTB = new TextBox();
		layoutPanel.add(ultimaVersionTB);
		layoutPanel.setWidgetLeftWidth(ultimaVersionTB, 70.0, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(ultimaVersionTB, 100.0, Unit.PX, 32.0, Unit.PX);
		ultimaVersionTB.setEnabled(false);
		
		//Sección donde se incluyen los materiales, los equipos y componentes a la lista de materiales.
		Label equiposYComponentesLabel = new Label("EQUIPOS, COMPONENTES Y MATERIALES INCLUIDOS");
		equiposYComponentesLabel.setStyleName("labelTitulo");
		layoutPanel.add(equiposYComponentesLabel);
		layoutPanel.setWidgetLeftWidth(equiposYComponentesLabel, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(equiposYComponentesLabel, 235.0, Unit.PX, 50.0, Unit.PX);
		
		ScrollPanel contenedorTablaSP = new ScrollPanel();
		contenedorTablaSP.setStyleName("tabla");
		layoutPanel.add(contenedorTablaSP);
		layoutPanel.setWidgetLeftWidth(contenedorTablaSP, 5.0, Unit.PCT, 90.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(contenedorTablaSP, 285.0, Unit.PX, 250.0, Unit.PX);
		
		materialEquiposYComponentesFT = new FlexTable();
		contenedorTablaSP.setWidget(materialEquiposYComponentesFT);
		materialEquiposYComponentesFT.setSize("100%", "100%");
		
		materialEquiposYComponentesFT.setText(0, CODIGO, "CÓDIGO");
		materialEquiposYComponentesFT.getCellFormatter().setWidth(0, CODIGO, "20%");
		materialEquiposYComponentesFT.setText(0, NOMBRE, "NOMBRE");
		materialEquiposYComponentesFT.getCellFormatter().setWidth(0, NOMBRE, "40%");
		materialEquiposYComponentesFT.setText(0, MEDIDA_VARIABLE_1, "MEDIDA VARIABLE 1");
		materialEquiposYComponentesFT.getCellFormatter().setWidth(0, MEDIDA_VARIABLE_1, "15%");
		materialEquiposYComponentesFT.setText(0, MEDIDA_VARIABLE_2, "MEDIDA VARIABLE 2");
		materialEquiposYComponentesFT.getCellFormatter().setWidth(0, MEDIDA_VARIABLE_2, "15%");
		materialEquiposYComponentesFT.setText(0, CANTIDAD, "CANTIDAD");
		materialEquiposYComponentesFT.getCellFormatter().setWidth(0, CANTIDAD, "10%");
		materialEquiposYComponentesFT.getRowFormatter().addStyleName(0, "tablaEncabezado");	
		
		Label pieLabel = new Label("");
		pieLabel.setStyleName("labelTitulo");
		layoutPanel.add(pieLabel);
		layoutPanel.setWidgetLeftWidth(pieLabel, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(pieLabel, 535.0, Unit.PX, 50.0, Unit.PX);
		
		
		//Sección de los últimos botones.
		Button salirBtn = new Button("SALIR");
		layoutPanel.add(salirBtn);
		layoutPanel.setWidgetRightWidth(salirBtn, 5.0, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(salirBtn, 600.0, Unit.PX, 28.0, Unit.PX);
		
		salirBtn.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				salir();
			}
		});
	}
	
	
	public void verListaMateriales(int idListaMateriales) {
		
		ingenieriaService.buscarListaMateriales(idListaMateriales, new AsyncCallback<ListaDeMaterialesDTO>(){
				
				@Override
				public void onFailure(Throwable caught) {
					Window.alert("ERROR EN EL SERVICIO.");
				}
	
				@Override
				public void onSuccess(ListaDeMaterialesDTO result) {
					
					listaDeMaterialesDTO = result;
					
					for (RenglonListaMaterialesDTO renglon : result.getRenglonListaMaterialesesDTO()) {
						
						if (renglon.getEquipoPatronDTO() != null)
							cargarEquipo(renglon.getEquipoPatronDTO(), renglon.getCantidad());
						else if (renglon.getComponentePatronDTO() != null)
							cargarComponente(renglon.getComponentePatronDTO(), renglon.getCantidad());
						else {
							if (renglon.getProductoDTO().getElemento().getTipoDimension().equals("SUPERFICIE"))
								cargarProducto(renglon.getProductoDTO(), renglon.getCantidad(), renglon.getMedida1(), renglon.getMedida2());
							else
								cargarProducto(renglon.getProductoDTO(), renglon.getCantidad(), renglon.getMedida1(), -1);
						}
					}
				}
			});
	}
	
	/**
	 * Método que carga un equipo que va a ser construido a la tabla de materiales, equipos y componentes.
	 */
	public void cargarProducto(ProductoDTO productoDTO, int cantidad, double medidaVariable1, double medidaVariable2) {
		
		int filaSiguiente = materialEquiposYComponentesFT.getRowCount();
		
		materialEquiposYComponentesFT.setText(filaSiguiente, CODIGO, Validaciones.rellenarCodigoProducto(productoDTO));
		
		materialEquiposYComponentesFT.setText(filaSiguiente, NOMBRE, productoDTO.getElemento().getClase().getNombre() + " - " + 
					productoDTO.getElemento().getNombre() + " - " + productoDTO.getMaterial().getNombre());
		
		materialEquiposYComponentesFT.setText(filaSiguiente, MEDIDA_VARIABLE_1, String.valueOf(medidaVariable1));
		
		if(medidaVariable2 != -1)
			materialEquiposYComponentesFT.setText(filaSiguiente, MEDIDA_VARIABLE_2, String.valueOf(medidaVariable2));
		
		materialEquiposYComponentesFT.setText(filaSiguiente, CANTIDAD, String.valueOf(cantidad));
		
		materialEquiposYComponentesFT.getRowFormatter().setStyleName(filaSiguiente, "tablaRenglon");
	}
	
	
	/**
	 * Método que carga un equipo que va a ser construido a la tabla de materiales, equipos y componentes.
	 */
	public void cargarEquipo(EquipoPatronDTO equipoPatronDTO, int cantidad) {
		
		int filaSiguiente = materialEquiposYComponentesFT.getRowCount();
		
		materialEquiposYComponentesFT.setText(filaSiguiente, CODIGO, Validaciones.rellenarCodigoEquipoPatron(equipoPatronDTO));
		
		materialEquiposYComponentesFT.setText(filaSiguiente, NOMBRE, equipoPatronDTO.getNombreClase() + " - " + equipoPatronDTO.getNombreSubclase());
		
		materialEquiposYComponentesFT.setText(filaSiguiente, CANTIDAD, String.valueOf(cantidad));
		
		materialEquiposYComponentesFT.getRowFormatter().setStyleName(filaSiguiente, "tablaRenglon");
	}
	
	/**
	 * Método que carga un componente que va a ser construido a la tabla de materiales, equipos y componentes.
	 */
	public void cargarComponente(ComponentePatronDTO componentePatronDTO, int cantidad) {
		
		int filaSiguiente = materialEquiposYComponentesFT.getRowCount();

		materialEquiposYComponentesFT.setText(filaSiguiente, CODIGO, Validaciones.rellenarCodigoComponentePatron(componentePatronDTO));
		
		materialEquiposYComponentesFT.setText(filaSiguiente, NOMBRE, componentePatronDTO.getNombre());
		
		materialEquiposYComponentesFT.setText(filaSiguiente, CANTIDAD, String.valueOf(cantidad));
		
		materialEquiposYComponentesFT.getRowFormatter().setStyleName(filaSiguiente, "tablaRenglon");
	}
	
	public void salir() {
		this.hide();
	}
}